home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Medal Software 1
/
Gold Medal Software Volume 1 (Gold Medal) (1994).iso
/
graphics
/
tierra40.arj
/
TIERRA
/
FRONTEND.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-09-09
|
7KB
|
275 lines
/* frontend.c 9-9-92 Tierra Simulator frontend routines */
/* Tierra Simulator V4.0: Copyright (c) 1991, 1992 Tom Ray & Virtual Life */
/* frontend rationale: to have a common set of functions for passing info
from Tierra to the front end. Any particular front end will likely
use only a subset of all frontend functions. Those functions that a
particular front end does not use, will either have to be implemented
here as dummy functions, or they will have to be ifdef'ed where they
are called from Tierra */
#ifndef lint
static char sccsid[] = "@(#)frontend.c 1.5 7/21/92";
#endif
#include "license.h"
#include "tierra.h"
#include "extern.h"
#ifdef ALCOMM
#include "tmonitor.h"
#include "trequest.h"
#endif
/* ======================================================================*/
/* include macros, functions */
/* ======================================================================*/
#if FRONTEND == STDIO
#include "tstdio.c"
#endif
#if FRONTEND == BASIC
#ifdef __TURBOC__
#include "tturbo.c"
#else
#include "tcurses.c"
#endif
#endif
#ifdef MEM_CHK
#include <memcheck.h>
#endif
/* ======================================================================*/
void FEMessage(n,pbuf)
I32s n;
I8s **pbuf;
{ I8s i;
I16s msgy;
#ifdef MEM_PROF
if (IMode == PLN_STATS) msgy = MSG_Y + 11;
else msgy = MSG_Y ;
#else
if (IMode == PLN_STATS) msgy = MSG_Y + 8;
else msgy = MSG_Y ;
#endif /* else of MEM_PROF */
for(i = 0; i < n; i++)
{
FEPrintf(MSG_X,msgy + i,0,"%s\n", mes[i]);
if(Log) fprintf(tfp_log,"%s\n", mes[i]);
}
#if FRONTEND != STDIO
FEClrmsg(msgy+i);
if ((IMode == SIZ_HIST) || (IMode == SIZM_HIST) || (IMode == GEN_HIST))
{
sleep(2);
query_species(fe_lines);
}
#endif
if(Log) fflush(tfp_log);
}
/* ======================================================================*/
#ifdef __TURBOC__
void FEError (I32s err_no, I32s err_exit, I32s err_write, ... )
#else /* else of __TURBOC__ */
#ifdef __GNUC__
void FEError (I32s err_no, I32s err_exit, I32s err_write, ... )
#else
void FEError (err_no,err_exit,err_write, va_alist)
I32s err_no,
err_exit,
err_write;
va_dcl
#endif /* __GNU__ */
#endif /* else of __TURBOC__ */
{
va_list ap;
I8s *err_str,
buf[85],
ch;
#ifdef __TURBOC__
va_start(ap,err_write);
#else /* else of __TURBOC__ */
#ifdef __GNUC__
va_start(ap,err_write);
#else
va_start(ap);
#endif /* __GNUC__ */
#endif /* else of __TURBOC__ */
if ((err_str = va_arg(ap, I8s *)) != NULL)
{
vsprintf(buf,err_str,ap);
FEPrintf(ERR_X,ERR_Y,1,buf);
#if FRONTEND == STDIO
FEPrintf(ERR_X,ERR_Y,0,"\n");
#endif
if(Log && (err_no > -200) && (err_no != -110))
{
vfprintf(tfp_log,err_str,ap);
fprintf(tfp_log,"\n");
}
}
va_end(ap);
#if FRONTEND != STDIO
if(strlen(buf) > 1 )
{
FEPrintf(HLP_X,HLP_Y,1 ,
" Tierra ERROR Press any key to continue ");
ch = FEGetc();
#ifdef __TURBOC__
if (ch == '~') FEMenu(); /* so that we can examin params */
#endif
}
#endif
if (err_write == WRITE)
{IMode = 69;
sprintf(mes[0],"Writing soup ...");
FEMessage(1,mes);
WriteSoup(err_exit);
IMode = PLN_STATS;
}
if (err_exit == EXIT)
{IMode = 69;
sprintf(mes[0],"Tierra going down ... ");
FEMessage(1,mes);
if(Log) { fclose(tfp_log);Log=0; }
while (hangup);
FEPrintf(HLP_X,HLP_Y,1 ,
" Tierra exiting (PRESS ANY KEY) \n");
FEGetc();
FEExit(err_no);
}
if(Log) fflush(tfp_log);
}
/* ------------------------------------------------------------------------ */
#ifdef MEM_PROF
void FEMemProf(SizSoup, SizCells, SizFreeMem, SizSl, SizSli,
SizGl, SizGli, SizGen)
I32s SizSoup, SizCells, SizFreeMem, SizSl, SizSli,
SizGl, SizGli, SizGen;
{
if ((IMode == SIZ_HIST) || (IMode == SIZM_HIST) || (IMode == GEN_HIST))
return ;
FEPrintf(PLN_X,PLN_Y+7,0,
" TotMemUse = %6ld SizFreeMem = %6ld SizCells = %6ld\n",
TotMemUse, SizFreeMem, SizCells);
FEPrintf(PLN_X,PLN_Y+8,0,
" SizSoup = %6ld SizSl = %6ld SizSli = %6ld\n",
SizSoup, SizSl, SizSli);
FEPrintf(PLN_X,PLN_Y+9,0,
" SizGl = %6ld SizGli = %6ld SizGen = %6ld\n",
SizGl, SizGli, SizGen);
}
#endif /* MEM_PROF */
/* ------------------------------------------------------------------------ */
void FEPlan(MaxPop, MaxMem, MaxGenPop, MaxGenMem)
I32s MaxPop, MaxMem;
Genotype *MaxGenPop, *MaxGenMem;
{ long int tp;
tp = time(NULL);
#ifdef __TURBOC__
if (Log) fprintf(tfp_log,"core = %ld\n",(I32u) coreleft());
#endif
#if FRONTEND != STDIO
if ((IMode == SIZ_HIST) || (IMode == SIZM_HIST)||(IMode == GEN_HIST))
query_species (fe_lines);
else
#endif
{
FEPrintf(PLN_X,PLN_Y,0,
"InstExeC = %6ld Generations = %6.0f %s",
InstExe.m, Generations, ctime(&tp));
if (GeneBnker)
{
FEPrintf(PLN_X,PLN_Y+1,0,
" NumCells = %6ld NumGenotypes = %6ld NumSizes = %6ld\n",
NumCells, NumGenotypes, NumSizes);
FEPrintf(PLN_X,PLN_Y+2,0,
" AvgSize = %6ld NumGenDG = %6ld NumGenRQ = %6ld\n",
AverageSize,NumGenDG,NumGenRQ);
}
else /* (GeneBnker) */
{
FEPrintf(PLN_X,PLN_Y+1,0, " NumCells = %6ld\n", NumCells);
FEPrintf(PLN_X,PLN_Y+2,0, " AvgSize = %6ld\n", AverageSize);
}
if (InstExe.m)
{
FEPrintf(PLN_X,PLN_Y+3,0,
" AvgPop = %6.0f Births = %6ld Deaths = %6ld\n",
TimePop,TimeBirth, TimeDeath);
if (GeneBnker)
{
FEPrintf(PLN_X,PLN_Y+5,0," MaxGenPop = %6ld (%4.4ld%3.3s)",
MaxPop,MaxGenPop->size, MaxGenPop->label);
FEPrintf(PLN_X+33,PLN_Y+5,0," MaxGenMem = %6ld (%4.4ld%3.3s)\n",
MaxMem / MaxGenMem->size, MaxGenMem->size, MaxGenMem->label);
}
}
FEPrintf(PLN_X,PLN_Y+((InstExe.m)?4:3),0,
" RateMut = %6ld RateMovMut = %6ld RateFlaw = %6ld\n",
RateMut, RateMovMut, RateFlaw);
} /* end of else on IMode */
if (Log)
{
fprintf(tfp_log,"\nie%ld gn%.0f %s",
InstExe.m, Generations, ctime(&tp));
fprintf(tfp_log, "nc%ld ng%ld ns%ld\n",
NumCells, NumGenotypes, NumSizes);
fprintf(tfp_log,"as%ld rq%ld dg%ld\n",
AverageSize, NumGenRQ, NumGenDG);
if (InstExe.m)
{
fprintf(tfp_log,"bi%ld de%ld ap%.0f\n",
TimeBirth, TimeDeath,TimePop);
if (GeneBnker)
{
fprintf(tfp_log,"mp%ld @ %4.4ld%3.3s",
MaxPop,MaxGenPop->size, MaxGenPop->label);
fprintf(tfp_log," mg%ld @ %4.4ld%3.3s\n",
MaxMem / MaxGenMem->size, MaxGenMem->size, MaxGenMem->label);
}
}
fprintf(tfp_log,
"rm%ld mm%ld rf%ld\n",
RateMut, RateMovMut, RateFlaw);
fprintf(tfp_log,"\n");
fflush(tfp_log);
}
#ifdef ALCOMM
if ( MIsDFEnabled( TrtPlanEvent ) )
{
TPlan();
}
#endif /* ALCOMM */
}
/* ======================================================================*/
/* ======================================================================*/
/* ======================================================================*/